{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Logistic回归与最大熵模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 兼容python2和python3\n",
    "from __future__ import print_function\n",
    "\n",
    "import numpy as np\n",
    "import scipy as sp\n",
    "import pandas as pd\n",
    "import sklearn\n",
    "import math\n",
    "import matplotlib.pyplot as plt\n",
    "from collections import Counter\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from math import exp\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "from sklearn.datasets import load_iris\n",
    "from sklearn.model_selection import train_test_split"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# data\n",
    "def create_data():\n",
    "    iris = load_iris()\n",
    "    df = pd.DataFrame(iris.data, columns=iris.feature_names)\n",
    "    df['label'] = iris.target\n",
    "    df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']\n",
    "    data = np.array(df.iloc[:100, [0,1,-1]])\n",
    "    # print(data)\n",
    "    return data[:,:2], data[:,-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "X, y = create_data()\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "class LogisticReressionClassifier:\n",
    "    def __init__(self, max_iter=200, learning_rate=0.01):\n",
    "        self.max_iter = max_iter\n",
    "        self.learning_rate = learning_rate\n",
    "\n",
    "    def sigmoid(self, x):\n",
    "        return 1 / (1 + exp(-x))\n",
    "\n",
    "    def data_matrix(self, X):\n",
    "        data_mat = []\n",
    "        for d in X:\n",
    "            data_mat.append([1.0, *d])\n",
    "        return data_mat\n",
    "\n",
    "    def fit(self, X, y):\n",
    "        # label = np.mat(y)\n",
    "        data_mat = self.data_matrix(X)  # m*n\n",
    "        self.weights = np.zeros((len(data_mat[0]), 1), dtype=np.float32)\n",
    "\n",
    "        for iter_ in range(self.max_iter):\n",
    "            for i in range(len(X)):\n",
    "                result = self.sigmoid(np.dot(data_mat[i], self.weights))\n",
    "                error = y[i] - result\n",
    "                self.weights += self.learning_rate * error * np.transpose(\n",
    "                    [data_mat[i]])\n",
    "        print('LogisticRegression Model(learning_rate={},max_iter={})'.format(\n",
    "            self.learning_rate, self.max_iter))\n",
    "\n",
    "    # def f(self, x):\n",
    "    #     return -(self.weights[0] + self.weights[1] * x) / self.weights[2]\n",
    "\n",
    "    def score(self, X_test, y_test):\n",
    "        right = 0\n",
    "        X_test = self.data_matrix(X_test)\n",
    "        for x, y in zip(X_test, y_test):\n",
    "            result = np.dot(x, self.weights)\n",
    "            if (result > 0 and y == 1) or (result < 0 and y == 0):\n",
    "                right += 1\n",
    "        return right / len(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "LogisticRegression Model(learning_rate=0.01,max_iter=200)\n"
     ]
    }
   ],
   "source": [
    "lr_clf = LogisticReressionClassifier()\n",
    "lr_clf.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9666666666666667"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lr_clf.score(X_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0xc642ac8>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_ponits = np.arange(4, 8)\n",
    "y_ = -(lr_clf.weights[1]*x_ponits + lr_clf.weights[0])/lr_clf.weights[2]\n",
    "plt.plot(x_ponits, y_)\n",
    "\n",
    "#lr_clf.show_graph()\n",
    "plt.scatter(X[:50,0],X[:50,1], label='0')\n",
    "plt.scatter(X[50:,0],X[50:,1], label='1')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import time\n",
    "import matplotlib.pyplot as plt\n",
    "from mpl_toolkits.mplot3d import Axes3D\n",
    "from pylab import mpl\n",
    "\n",
    "# 图像显示中文\n",
    "mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']\n",
    "\n",
    "\n",
    "class LogisticRegression:\n",
    "    def __init__(self, learn_rate=0.1, max_iter=10000, tol=1e-2):\n",
    "        self.learn_rate = learn_rate  # 学习率\n",
    "        self.max_iter = max_iter  # 迭代次数\n",
    "        self.tol = tol  # 迭代停止阈值\n",
    "        self.w = None  # 权重\n",
    "\n",
    "    def preprocessing(self, X):\n",
    "        \"\"\"将原始X末尾加上一列，该列数值全部为1\"\"\"\n",
    "        row = X.shape[0]\n",
    "        y = np.ones(row).reshape(row, 1)\n",
    "        X_prepro = np.hstack((X, y))\n",
    "        return X_prepro\n",
    "\n",
    "    def sigmod(self, x):\n",
    "        return 1 / (1 + np.exp(-x))\n",
    "\n",
    "    def fit(self, X_train, y_train):\n",
    "        X = self.preprocessing(X_train)\n",
    "        y = y_train.T\n",
    "        # 初始化权重w\n",
    "        self.w = np.array([[0] * X.shape[1]], dtype=np.float)\n",
    "        k = 0\n",
    "        for loop in range(self.max_iter):\n",
    "            # 计算梯度\n",
    "            z = np.dot(X, self.w.T)\n",
    "            grad = X * (y - self.sigmod(z))\n",
    "            grad = grad.sum(axis=0)\n",
    "            # 利用梯度的绝对值作为迭代中止的条件\n",
    "            if (np.abs(grad) <= self.tol).all():\n",
    "                break\n",
    "            else:\n",
    "                # 更新权重w 梯度上升——求极大值\n",
    "                self.w += self.learn_rate * grad\n",
    "                k += 1\n",
    "        print(\"迭代次数：{}次\".format(k))\n",
    "        print(\"最终梯度：{}\".format(grad))\n",
    "        print(\"最终权重：{}\".format(self.w[0]))\n",
    "\n",
    "    def predict(self, x):\n",
    "        p = self.sigmod(np.dot(self.preprocessing(x), self.w.T))\n",
    "        print(\"Y=1的概率被估计为：{:.2%}\".format(p[0][0]))  # 调用score时，注释掉\n",
    "        p[np.where(p > 0.5)] = 1\n",
    "        p[np.where(p < 0.5)] = 0\n",
    "        return p\n",
    "\n",
    "    def score(self, X, y):\n",
    "        y_c = self.predict(X)\n",
    "        error_rate = np.sum(np.abs(y_c - y.T)) / y_c.shape[0]\n",
    "        return 1 - error_rate\n",
    "\n",
    "    def draw(self, X, y):\n",
    "        # 分离正负实例点\n",
    "        y = y[0]\n",
    "        X_po = X[np.where(y == 1)]\n",
    "        X_ne = X[np.where(y == 0)]\n",
    "        # 绘制数据集散点图\n",
    "        ax = plt.axes(projection='3d')\n",
    "        x_1 = X_po[0, :]\n",
    "        y_1 = X_po[1, :]\n",
    "        z_1 = X_po[2, :]\n",
    "        x_2 = X_ne[0, :]\n",
    "        y_2 = X_ne[1, :]\n",
    "        z_2 = X_ne[2, :]\n",
    "        ax.scatter(x_1, y_1, z_1, c=\"r\", label=\"正实例\")\n",
    "        ax.scatter(x_2, y_2, z_2, c=\"b\", label=\"负实例\")\n",
    "        ax.legend(loc='best')\n",
    "        # 绘制p=0.5的区分平面\n",
    "        x = np.linspace(-3, 3, 3)\n",
    "        y = np.linspace(-3, 3, 3)\n",
    "        x_3, y_3 = np.meshgrid(x, y)\n",
    "        a, b, c, d = self.w[0]\n",
    "        z_3 = -(a * x_3 + b * y_3 + d) / c\n",
    "        ax.plot_surface(x_3, y_3, z_3, alpha=0.5)  # 调节透明度\n",
    "        plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "迭代次数：3232次\n",
      "最终梯度：[ 0.00144779  0.00046133  0.00490279 -0.00999848]\n",
      "最终权重：[  2.96908597   1.60115396   5.04477438 -13.43744079]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 训练数据集\n",
    "X_train = np.array([[3, 3, 3], [4, 3, 2], [2, 1, 2], [1, 1, 1], [-1, 0, 1],\n",
    "                    [2, -2, 1]])\n",
    "y_train = np.array([[1, 1, 1, 0, 0, 0]])\n",
    "# 构建实例，进行训练\n",
    "clf = LogisticRegression()\n",
    "clf.fit(X_train, y_train)\n",
    "clf.draw(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
